home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
2499.ZIP
/
WIPASCAL.ZIP
/
SMOKER.PAS
< prev
Wrap
Pascal/Delphi Source File
|
1990-09-24
|
2KB
|
111 lines
PROGRAM CigSmok(Input, Output);
CONST
NumCig = 15; { # of cigarettes for each smoker }
paper = 1; { . }
match = 3; { . Resources }
tobacco = 5; { . }
TYPE
semaphore = Integer;
resource = Integer;
VAR
S : ARRAY[1..8] OF semaphore;
alive : ARRAY[1..8] OF Boolean;
NumLeft : ARRAY[1..3] of integer;
a : semaphore;
k, m : Integer;
FUNCTION VALID(a, b : resource) : Boolean;
BEGIN
VALID := False;
IF a<>b then
IF alive[a+b] THEN
VALID := True;
END;
PROCEDURE agent;
VAR
r1, r2 : resource;
j : Integer;
BEGIN
FOR j := 1 TO 3*NumCig DO BEGIN
WAIT(a);
REPEAT
r1 := 2*random(3) + 1;
r2 := 2*random(3) + 1;
UNTIL VALID(r1, r2);
SIGNAL(S[r1+r2]);
END;
END;
procedure display;
var
loop : Integer;
begin
Disable;
{ write( chr(27),'[2J' ); }
ClrScr;
for loop := 1 to 3 do
if ( NumLeft[loop] > 0 ) then
writeln( '=':NumLeft[loop] )
else
writeln( 'OX' );
Enable;
end;
procedure beep;
begin
Disable;
Sound( 100 );
Delay( 250 );
NoSound;
Enable;
end;
procedure smoker(r3 : resource);
var
i : resource;
j, y : Integer;
begin
i := (paper+match+tobacco)-r3;
j := NumCig;
y := (r3+1) div 2;
repeat
wait( s[i] );
j := j - 1;
NumLeft[y] := j;
display;
{ write( chr(27), '[', r3:1, ';', j:1, 'H', ' '); }
if j = 0 then
alive[i] := False;
signal(a)
until j = 0;
beep;
end;
BEGIN
{ writeln( chr(27),'[2J' ); }
ClrScr;
a := 1;
FOR k := 1 TO 8 DO S[k] := 0; { Zero Semaphore array }
FOR k := 1 TO 8 DO alive[k] := True;
FOR k := 1 TO 3 DO NumLeft[k] := NumCig;
for m:=0 to 2 do
begin
writeln( '=':NumCig );
end;
cobegin
agent;
smoker(paper); smoker(match); smoker(tobacco)
coend;
END.